package mx.edu.itesm.daai.tour;

/**
 * Simple class that manages placements and their rendering.
 *
 * @author Alan Berg
 *
 */
public class TourGenerator {
        
        EdificioSet oficinas[] = new EdificioSet[5];
        EdificioSet aulas[] = new EdificioSet[4];
        
        

	public TourGenerator(){
            init();
	}
	//Initiate styles
	public void init(){
            initOficinas();
            initAulas();
	}
        
        public void initOficinas(){
            oficinas[0] = new EdificioSet();
            EdificioBean tmp = new EdificioBean();
            tmp.setName("Oficinas I");
            tmp.setLookAtLongitude("-99.13538765812712");
            tmp.setLookAtLatitude("19.28478903381217");
            tmp.setLookAtAltitude("0");
            tmp.setLookAtRange("66");
            tmp.setLookAtTilt("0");
            tmp.setLookAtHeading("19.28478903381217");
            tmp.setLookAtAltitudeMode("relativeToGround");
            tmp.setStyleUrl("#invisible");
            tmp.setPointCoordinates("-99.13538765808687,19.28478903365542,0");
            oficinas[0].setVistaArea(tmp);
            oficinas[0].generateVistas();
            
            oficinas[1] = new EdificioSet();
            EdificioBean tmp2 = new EdificioBean();
            tmp2.setName("Oficinas II");
            tmp2.setLookAtLongitude("-99.13630699319941");
            tmp2.setLookAtLatitude("19.28491723580305");
            tmp2.setLookAtAltitude("0");
            tmp2.setLookAtRange("66.29548233578019");
            tmp2.setLookAtTilt("-6.460433075918815e-012");
            tmp2.setLookAtHeading("1.844458781127963");
            tmp2.setLookAtAltitudeMode("relativeToGround");
            tmp2.setStyleUrl("#invisible");
            tmp2.setPointCoordinates("-99.1363069934324,19.28491723594686,1");
            oficinas[1].setVistaArea(tmp2);
            oficinas[1].generateVistas();
            
            oficinas[2] = new EdificioSet();
            EdificioBean tmp3 = new EdificioBean();
            tmp3.setName("Oficinas III");
            tmp3.setLookAtLongitude("-99.13672107854612");
            tmp3.setLookAtLatitude("19.28439103167036");
            tmp3.setLookAtAltitude("0");
            tmp3.setLookAtRange("62.2682403587167");
            tmp3.setLookAtTilt("-2.870560042155111e-012");
            tmp3.setLookAtHeading("1.844316681919561");
            tmp3.setLookAtAltitudeMode("relativeToGround");
            tmp3.setStyleUrl("#invisible");
            tmp3.setPointCoordinates("-99.13672107882803,19.13672107882803,0");
            oficinas[2].setVistaArea(tmp3);
            oficinas[2].generateVistas();
            
            oficinas[3] = new EdificioSet();
            EdificioBean tmp4 = new EdificioBean();
            tmp4.setName("Oficinas IV");
            tmp4.setLookAtLongitude("-99.13653592538189");
            tmp4.setLookAtLatitude("19.28541394679984");
            tmp4.setLookAtAltitude("0");
            tmp4.setLookAtRange("80");
            tmp4.setLookAtTilt("-7.518465864213979e-012");
            tmp4.setLookAtHeading("1.84437781842934");
            tmp4.setLookAtAltitudeMode("relativeToGround");
            tmp4.setStyleUrl("#invisible");
            tmp4.setPointCoordinates("-99.13653592549458,19.28541394659295,0");
            oficinas[3].setVistaArea(tmp4);
            oficinas[3].generateVistas();
            
            oficinas[4] = new EdificioSet();
            EdificioBean tmp5 = new EdificioBean();
            tmp5.setName("Oficinas V");
            tmp5.setLookAtLongitude("-99.13626309550077");
            tmp5.setLookAtLatitude("19.28300921897283");
            tmp5.setLookAtAltitude("0");
            tmp5.setLookAtRange("66.50299394018889");
            tmp5.setLookAtTilt("1.244632484961541e-012");
            tmp5.setLookAtHeading("1.844467942913993");
            tmp5.setLookAtAltitudeMode("relativeToGround");
            tmp5.setStyleUrl("#invisible");
            tmp5.setPointCoordinates("-99.13626309560431,19.28300921915092,0");
            oficinas[4].setVistaArea(tmp5);
            oficinas[4].generateVistas();
        }
        
        public void initAulas(){
            aulas[0] = new EdificioSet();
            EdificioBean tmp = new EdificioBean();
            tmp.setName("Aulas I");
            tmp.setLookAtLongitude("-99.1357727914309");
            tmp.setLookAtLatitude("19.28503613096132");
            tmp.setLookAtAltitude("0");
            tmp.setLookAtRange("95");
            tmp.setLookAtTilt("7.712696523606201e-012"); 
            tmp.setLookAtHeading("1.844163174943728");
            tmp.setLookAtAltitudeMode("relativeToGround");
            tmp.setStyleUrl("#invisible");
            tmp.setPointCoordinates("-99.13577279177453,19.28503613098604,0");
            aulas[0].setVistaArea(tmp);
            aulas[0].generateVistas();
            
            aulas[1] = new EdificioSet();
            EdificioBean tmp2 = new EdificioBean();
            tmp2.setName("Aulas II");
            tmp2.setLookAtLongitude("-99.13670912001101");
            tmp2.setLookAtLatitude("19.28482392024702");
            tmp2.setLookAtAltitude("0");
            tmp2.setLookAtRange("87.72829251455238");
            tmp2.setLookAtTilt("0");
            tmp2.setLookAtHeading("1.844325973597595");
            tmp2.setLookAtAltitudeMode("relativeToGround");
            tmp2.setStyleUrl("#invisible");
            tmp2.setPointCoordinates("-99.13670911994448,19.28482392055221,1");
            aulas[1].setVistaArea(tmp2);
            aulas[1].generateVistas();
            
            aulas[2] = new EdificioSet();
            EdificioBean tmp3 = new EdificioBean();
            tmp3.setName("Aulas III");
            tmp3.setLookAtLongitude("-99.13703660388894");
            tmp3.setLookAtLatitude("19.28402267289512");
            tmp3.setLookAtAltitude("0");
            tmp3.setLookAtRange("85.21484288036785");
            tmp3.setLookAtTilt("0");
            tmp3.setLookAtHeading("1.844161361226368");
            tmp3.setLookAtAltitudeMode("relativeToGround");
            tmp3.setStyleUrl("#invisible");
            tmp3.setPointCoordinates("-99.13703660384043,19.28402267264472,0");
            aulas[2].setVistaArea(tmp3);
            aulas[2].generateVistas();
            
            aulas[3] = new EdificioSet();
            EdificioBean tmp4 = new EdificioBean();
            tmp4.setName("Aulas IV");
            tmp4.setLookAtLongitude("-99.13521034998149");
            tmp4.setLookAtLatitude("19.28507510936026");
            tmp4.setLookAtAltitude("0");
            tmp4.setLookAtRange("71.10570828567342");
            tmp4.setLookAtTilt("-1.002852211321774e-011");
            tmp4.setLookAtHeading("1.844780500945183");
            tmp4.setLookAtAltitudeMode("relativeToGround");
            tmp4.setStyleUrl("#invisible");
            tmp4.setPointCoordinates("-99.1352103498856,19.28507510951872,0");
            aulas[3].setVistaArea(tmp4);
            aulas[3].generateVistas();
        }

        	/**
	 * Renders the Tour for  Aulas Oficinas
	 * @return valid CCM Tourt as a String
	 */
	public synchronized String aulasOficinas(){
		return generateAulasOficinasTour();
	}

	private String generateAulasOficinasTour(){
		String tour ="<Document>\n"+
			"\t<name> Aulas Oficinas Tour </name>\n";
                
                tour+=generateAulasDocument(0);
                tour+=generateAulasDocument(1);
                tour+=generateAulasDocument(2);
                tour+=generateAulasDocument(3);
                tour+=generateOficinasDocument(0);
                tour+=generateOficinasDocument(1);
                
                tour+="</Document>\n";
                return tour;
	}
        
	/**
	 * Renders the Tour for Oficinas
	 * @return valid CCM Tourt as a String
	 */
	public synchronized String oficinas(){
		return generateOficinasTour();
	}

	private String generateOficinasTour(){
		String tour ="<Document>\n"+
			"\t<name> Oficinas Tour </name>\n";
                for(int i=0; i<oficinas.length;i++){
                    tour+=generateOficinasDocument(i);
                }
                tour+="</Document>\n";
                return tour;
	}
        
        private String generateOficinasDocument(int i){
            EdificioSet edifSet=oficinas[i];
                    
            String document = "";
            document+= generateStyles();
            switch(i){
                case 0:
                    document+=generateEdificio(edifSet.getVistaSur());
                    document+=generateEdificio(edifSet.getVistaOeste());
                    document+=generateEdificio(edifSet.getVistaArea());
                    document+=generateEdificio(edifSet.getVistaNorte());
                    document+=generateEdificio(edifSet.getVistaEste());
                    
                    break;
                case 1:
                    document+=generateEdificio(edifSet.getVistaSur());
                    document+=generateEdificio(edifSet.getVistaEste());
                    document+=generateEdificio(edifSet.getVistaArea());
                    document+=generateEdificio(edifSet.getVistaNorte());
                    edifSet.getVistaOeste().setLookAtHeading("300");
                    document+=generateEdificio(edifSet.getVistaOeste());
                    break;
                case 2:
                    document+=generateEdificio(edifSet.getVistaOeste());
                    document+=generateEdificio(edifSet.getVistaSur());
                    document+=generateEdificio(edifSet.getVistaArea());
                    document+=generateEdificio(edifSet.getVistaEste());
                    document+=generateEdificio(edifSet.getVistaNorte());
                    
                    break;
                case 3:
                    document+=generateEdificio(edifSet.getVistaSur());
                    document+=generateEdificio(edifSet.getVistaEste());
                    document+=generateEdificio(edifSet.getVistaArea());
                    document+=generateEdificio(edifSet.getVistaNorte());
                    document+=generateEdificio(edifSet.getVistaOeste());
                    break;
                case 4:
                    document+=generateEdificio(edifSet.getVistaSur());
                    document+=generateEdificio(edifSet.getVistaEste());
                    document+=generateEdificio(edifSet.getVistaArea());
                    document+=generateEdificio(edifSet.getVistaNorte());
                    document+=generateEdificio(edifSet.getVistaOeste());
                    break;
            }
            
            return document;
        }
        
        public synchronized String aulas(){
		return generateAulasTour();
	}

	private String generateAulasTour(){
		String tour ="<Document>\n"+
			"\t<name> Aulas Tour </name>\n";
                for(int i=0; i<aulas.length;i++){
                    tour+=generateAulasDocument(i);
                }
                tour+="</Document>\n";
                return tour;
	}
        
        private String generateAulasDocument(int i){
            EdificioSet edifSet=aulas[i];
                    
            String document = "";
            document+= generateStyles();
            switch(i){
                case 0:
                    document+=generateEdificio(edifSet.getVistaSur());
                    document+=generateEdificio(edifSet.getVistaEste());
                    document+=generateEdificio(edifSet.getVistaOeste());
                    document+=generateEdificio(edifSet.getVistaArea());
                    document+=generateEdificio(edifSet.getVistaNorte());
                    
                    break;
                case 1:
                    document+=generateEdificio(edifSet.getVistaSur());
                    document+=generateEdificio(edifSet.getVistaEste());
                    document+=generateEdificio(edifSet.getVistaArea());
                    document+=generateEdificio(edifSet.getVistaNorte());
                    document+=generateEdificio(edifSet.getVistaOeste());
                    break;
                case 2:
                    document+=generateEdificio(edifSet.getVistaSur());
                    document+=generateEdificio(edifSet.getVistaEste());
                    document+=generateEdificio(edifSet.getVistaArea());
                    document+=generateEdificio(edifSet.getVistaNorte());
                    document+=generateEdificio(edifSet.getVistaOeste());
                    break;
                case 3:
                    document+=generateEdificio(edifSet.getVistaSur());
                    document+=generateEdificio(edifSet.getVistaEste());
                    document+=generateEdificio(edifSet.getVistaArea());
                    document+=generateEdificio(edifSet.getVistaNorte());
                    document+=generateEdificio(edifSet.getVistaOeste());
                    break;
            }
            
            return document;
        }
        
        private String generateEdificioDocument(EdificioSet edifSet){
            String document = "";
            document+= generateStyles();
            document+=generateEdificio(edifSet.getVistaSur());
            document+=generateEdificio(edifSet.getVistaEste());
            document+=generateEdificio(edifSet.getVistaArea());
            document+=generateEdificio(edifSet.getVistaNorte());
            document+=generateEdificio(edifSet.getVistaOeste());
            
            return document;
        }
        
        private String generateStyles(){
            String styleInvis="<Style id='invisible'>\n"+
                    "\t<IconStyle>\n"+
                            "\t\t<color>00ffffff</color>\n"+
                            "\t\t<scale>1.3</scale>\n"+
                            "\t\t<Icon>\n"+
                                    "\t\t\t<href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>\n"+
                            "\t\t</Icon>\n"+
                            "\t\t<hotSpot x='20' y='2' xunits='pixels' yunits='pixels'/>\n"+
                    "\t</IconStyle>\n"+
                    "\t<LabelStyle>\n"+
                            "\t\t<color>00ffffff</color>\n"+
                    "\t</LabelStyle>\n"+
            "</Style>\n";
            return styleInvis;
        }

    private String generateEdificio(EdificioBean edificio){
    	  String klmString="<Placemark>\n"+
    	    "\t<name>"+edificio.getName()+"</name>\n"+
    	    //"\t<description><![CDATA["+edificio.getDescription()+"]]></description>\n"+
            "\t<LookAt>\n"+
		"\t\t<longitude>"+ edificio.getLookAtLongitude() +"</longitude>\n"+
		"\t\t<latitude>"+ edificio.getLookAtLatitude() +"</latitude>\n"+
		"\t\t<altitude>"+ edificio.getLookAtAltitude() +"</altitude>\n"+
                "\t\t<range>"+ edificio.getLookAtRange() +"</range>\n"+
                "\t\t<tilt>"+ edificio.getLookAtTilt() +"</tilt>\n"+
                "\t\t<heading>"+ edificio.getLookAtHeading() +"</heading>\n"+
                "\t\t<altitudeMode>"+ edificio.getLookAtAltitudeMode() +"</altitudeMode>\n"+
            "\t</LookAt>\n"+
    	    "\t<styleUrl>"+edificio.getStyleUrl()+"</styleUrl>\n"+
    	    "\t<Point>\n"+
    	     "\t\t<coordinates>"+edificio.getPointCoordinates()+"</coordinates>\n"+
    	    "\t</Point>\n"+
    	 "</Placemark>\n";
    	return klmString;
    }
}
